::: scene subject

# GORM 框架篇

## 常用查询方式

:::

::: scene code 主键查询

```go
user := User{}
db.First(&user, 10)
```

L2->First 函数的第二个参数允许提供一个整数来作为主键查询条件。

```sql
SELECT * FROM `users` WHERE `users`.`id` = 10 ORDER BY `users`.`id` LIMIT 1
```

L1->这是最终构造出来的 SQL 语句。

:::

::: scene code 范围查询

```go
users := []User{}
db.Find(&users, []int{1, 2, 3})
```

L2->这里给到 Find 方法的第二个参数是一个整数数组，它将限定查询主键值只在数组范围内的记录。

```sql
SELECT * FROM `users` WHERE `users`.`id` IN (1,2,3)
```

L1->这是最终构造出来的 SQL 语句。

:::

::: scene code 预处理语句

```go
user := User{}
db.First(&user, "id = ?", "10")
```

L2->基于安全考虑，如果是字符串传值的，可以通过预处理语句的方式去规避 SQL 注入。

```sql
SELECT * FROM `users` WHERE id = '10' ORDER BY `users`.`id` LIMIT 1
```

L1->这是最终构造出来的 SQL 语句。

:::

::: scene code 模型条件

```go
user = User{ID: 10}
db.First(&user)

user = User{ID: 10}
db.Model(User{ID: 10}).First(&user)
```

L2->如果模型中的属性有设置了值，它们将成为查询条件的一部分。

```sql
SELECT * FROM `users` WHERE `users`.`id` = 10 ORDER BY `users`.`id` LIMIT 1
```

L1->这是最终构造出来的 SQL 语句。

:::

::: scene code 软删除

```go
type User struct {
	ID        uint `gorm:"primarykey"`
	Name      string
	Age       int8
	DeletedAt gorm.DeletedAt `gorm:"index"`
}

user := User{ID: 10}
db.First(&user)
```

L5->GORM 提供了 gorm.DeletedAt 类型来实现软删除功能。

```sql
SELECT * FROM `users` WHERE id = '10' AND `users`.`deleted_at` IS NULL ORDER BY `users`.`id` LIMIT 1
```

L1->这是最终构造出来的 SQL 语句。

:::

::: scene link 更多资料 https://imshann.gitee.io/study-go/gorm/query.html

:::

::: scene 感谢观看

<p className="text-center text-4xl mt-32">如果你喜欢我创作的内容，邀请你关注、投币或收藏</p>
<p className="text-center text-4xl mt-24" style={{ color: "#ffde00" }}>Author：黑爷</p>

:::

